package com.rui.cn.util;

import com.rui.cn.dto.TreeDto;
import com.rui.cn.entity.system.SysMenu;
import com.rui.cn.entity.system.SysPermission;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 *@ 描述：树结构帮助类
 *@ 类名：TestMenu
 *@ 创建人：[zhang]
 *@ 创建时间：2017/6/19 0019-下午 20:22
 **/
public class MenuUtil {

    public static <T> void sortTreeList(List<T> sortTreeList,
                                        List<T> treeList,
                                        Integer parentId){
        /**
         * 1:轮询待排序列表,找到当前父节点的下一级某个节点
         * 2:将当前节点放入指定的列表
         * 3:轮询待排序列表,找到当前菜单
         * 4:重复 1,2,3
         * 5:break;
         */
        for(int i = 0; i<treeList.size();i++){
            TreeDto m = (TreeDto) treeList.get(i);
            //找到第一级
            if(m.getParentid()!=null&&m.getParentid().equals(parentId)){
                sortTreeList.add((T)m);
                //递归
                sortTreeList(sortTreeList,treeList,m.getId());
            }
        }
      /*  for(int i = 0; i<treeList.size();i++){
            MenuEntity m = (MenuEntity) treeList.get(i);
            //找到第一级
            if(m.getParentid()!=null&&m.getParentid().equals(parentId)){
                sortTreeList.add((T)m);
                for(T child: treeList){
                    if(((MenuEntity)child).getParentid()!=null&&((MenuEntity)child).getParentid().equals(parentId)){
                        //递归
                        sortTreeList(sortTreeList,treeList,m.getId());
                        break;
                    }
                }
            }

        }*/

    }
    /**
     * 获取指定父节点下面的所有子节点(儿子,孙子,包括自己)
     * @param childrenMap
     * @param treeList
     * @param parentId
     * @return
     */
    public  static Map<Integer,TreeDto> getAllChildrenMap(Map<Integer,TreeDto> childrenMap,
                                                          List<TreeDto> treeList,Integer parentId){
        for(TreeDto tree :treeList){
            if(tree.getParentid().longValue()==parentId){
                childrenMap.put(tree.getId(), tree);
                getAllChildrenMap(childrenMap,treeList,tree.getId());
            }
        }
        return  childrenMap;
    }

    /**
     * 递归查询一个菜单所有的子菜单
     * @param menuList
     * @return
     */
    public static List<SysMenu> sortMenuList (List<SysMenu> menuList) {
        // 最后的结果
        List<SysMenu> arrayList = new ArrayList<SysMenu>();
        // 先找到所有的一级菜单
        for (int i = 0; i < menuList.size(); i++) {
            // 一级菜单没有parentId
            if (menuList.get(i).getParentid()==0) {
                arrayList.add(menuList.get(i));
            }
        }
        for (SysMenu menu : arrayList) {
            menu.setChildren(getChild(menu.getId(), menuList));
        }
        return arrayList;
    }
    /**
     * 递归查找子菜单
     * @param id
     *            当前菜单id
     * @param rootMenu
     *            要查找的列表
     * @return
     */
    private static List<SysMenu> getChild(Integer id, List<SysMenu> rootMenu) {
        // 子菜单
        List<SysMenu> childList = new ArrayList<SysMenu>();
        for (SysMenu menu : rootMenu) {
            // 遍历所有节点，将父菜单id与传过来的id比较
            if (menu.getParentid()!=0) {
                if (menu.getParentid()==id) {
                    childList.add(menu);
                }
            }
        }
        // 把子菜单的子菜单再循环一遍
        for (SysMenu menu : childList) {// 没有url子菜单还有子菜单
            if (StringUtils.isNotBlank(menu.getHref())) {
                // 递归
                menu.setChildren(getChild(menu.getId(), rootMenu));
            }
        } // 递归退出条件
        if (childList.size() == 0) {
            return null;
        }
        return childList;
    }
    //对菜单进行排序
    public static List<SysMenu> sortedMenuList(Integer id, List<SysMenu> rootMenu) {
        // 最后的结果
        List<SysMenu> arrayList = new ArrayList<SysMenu>();
        // 先找到所有的一级菜单
        for (int i = 0; i < rootMenu.size(); i++) {
            // 一级菜单没有parentId=id
            if (rootMenu.get(i).getParentid()==id) {
                arrayList.add(rootMenu.get(i));
            }
            for(SysMenu m:rootMenu){
                if(m.getParentid().equals(rootMenu.get(i).getId())){
                    arrayList.add(m);
                }
            }
        }
        if(rootMenu.size()==1){
            arrayList=rootMenu;
        }
        return  arrayList;
    }
    //对权限菜单进行排序
    public static List<SysPermission> sortedPermisList(Integer id, List<SysPermission> rootMenu) {
        // 最后的结果
        List<SysPermission> arrayList = new ArrayList<SysPermission>();
        // 先找到所有的一级菜单
        for (int i = 0; i < rootMenu.size(); i++) {
            // 一级菜单没有parentId=id
            if (rootMenu.get(i).getParentid()==id) {
                arrayList.add(rootMenu.get(i));
            }
            for(SysPermission m:rootMenu){
                if(m.getParentid().equals(rootMenu.get(i).getId())){
                    arrayList.add(m);
                }
            }
        }
        if(rootMenu.size()==1){
            arrayList=rootMenu;
        }
        return  arrayList;
    }

}
